#ifndef EVENTLOOP_HPP
#define EVENTLOOP_HPP

#include <functional>
#include <memory>
#include <vector>
#include <assert.h>
#include <unistd.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <mutex>
#include "Channel.hpp"
#include "Poller.hpp"
#include <atomic>

#include <boost/lockfree/spsc_queue.hpp>
// using namespace boost::lockfree;

/**
 * 事件循环核心 ：每个 EventLoop 运行在一个独立线程中，负责监听和分发事件（I/O 事件、定时器事件、用户自定义任务）。
 * 线程绑定 ：每个线程有且仅有一个 EventLoop 实例，确保线程安全。
 * 跨线程通信 ：通过 event_fd 实现线程间唤醒（例如主线程向子线程提交新连接任务）。
 */
class EventLoop
{
public:
    typedef std::function<void()> Function;
    // 初始化poller, event_fd，给 event_fd 注册到 epoll 中并注册其事件处理回调
    EventLoop();
    ~EventLoop();
    // 开始事件循环 调用该函数的线程必须是该 EventLoop 所在线程，也就是 startLoop 函数不能跨线程调用
    void startLoop();
    // 停止 Loop，给主线程用的
    void stopLoop();
    // 把此函数放入等待执行函数区
    void queueInPendingFunctions(Function&& func);
    void addChannel(ChannelPtr channel);
    void removeChannel(ChannelPtr channel);
    // noncopyable
    EventLoop(const EventLoop&) = delete;
    EventLoop& operator=(const EventLoop&) = delete;

    std::string getLoopId() const { return loopId_; }
private:
    // 创建eventfd，类似管道的进程间通信方式
    static int createEventFd();
    // eventfd的读回调函数(因为主线程向event_fd写了数据，所以触发可读事件，从event_fd读数据)
    void handleRead();
    // eventfd的更新事件回调函数(更新监听事件)，暂时无用
    void handleUpdate() {};
    // eventfd的错误回调函数，暂时无用
    void handleError() {};
    // 执行正在等待的函数(SubLoop注册EpollAdd连接套接字以及绑定事件的函数)
    void performPendingFunctions();
    // 唤醒 EventLoop 所在线程
    void wakeUp();
    // 判断当前线程是否是 EventLoop 所在线程
    // bool is_in_loop_thread() const { return syscall(SYS_gettid) == thread_id_; }
    
private:
    // io多路复用 分发器
    std::shared_ptr<Poller> poller_;
    // 用于异步唤醒 SubLoop 的 startLoop 函数中的Poll(epoll_wait因为还没有注册fd会⼀直阻塞)
    int eventFd_;
    // 用于异步唤醒的 channel
    ChannelPtr eventChannel_;
    
    
    // 只在交换函数的vector时使用
    // mutable std::mutex pf_swap_mutex_;
    // std::vector<Function> pendingFunctions_; // 正在等待处理的函数
    boost::lockfree::spsc_queue<Function, boost::lockfree::capacity<4096>> pendingFunctions_; // 正在等待处理的函数
    std::vector<Function> functions; // 正在处理的函数
    std::atomic_bool isQuit_;
    std::atomic_bool isLooping_;
    bool isEventHandling_; // 没啥用

    std::string loopId_;
};
typedef std::shared_ptr<EventLoop> sp_EventLoop;


#endif // EVENTLOOP_HPP